集中异常处理
功能
- 确保所有控制器中的异常都能够被捕获和处理,保持异常处理逻辑的集中化,使得代码更加整洁、可维护
实现
@ExceptionHandler
:捕获给定类型的异常@RestContrllorAdvice
:@ContrllorAdvice
+@RespponseBody
@ControllerAdvice
:自动捕获所有控制器抛出的异常,实现全局异常处理@ResponseStatus
:为自定义异常指定 HTTP 状态码和错误消息,简化异常处理- 自定义异常
//创建自定义错误响应体
@Data
@AllArgsConstructor
public class ErrorResponse {
private String message;
private int statusCode;
}
// 创建自定义异常
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message); // 调用父类构造函数,并传入 message 参数
}
}
//创建全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
// 处理所有的 IllegalArgumentException 异常
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST) // 直接通过注解设置状态码
@ResponseBody // 表示作为HTTP的响应体返回,将结果转换为json格式响应回前端
public ErrorResponse handleIllegalArgumentException(IllegalArgumentException ex) {
// 返回自定义的错误响应体
return new ErrorResponse("Invalid argument: " + ex.getMessage(), HttpStatus.BAD_REQUEST.value());
}
// 处理所有的 NullPointerException 异常
@ExceptionHandler(NullPointerException.class)
@ResponseBody // 表示响应体返回,自动将返回的 Java 对象转化为 JSON 格式
public ResponseEntity<ErrorResponse> handleNullPointerException(NullPointerException ex) {
// 构造错误响应体
ErrorResponse errorResponse = new ErrorResponse("Null pointer exception occurred", HttpStatus.INTERNAL_SERVER_ERROR.value());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); // 在响应实体中设置返回状态码
}
//处理自定义异常
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseBody
public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {
// 处理自定义异常,构造错误响应体
ErrorResponse errorResponse = new ErrorResponse(ex.getMessage(), ex.getErrorCode());
// 返回响应实体,包含错误信息和 HTTP 状态码
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
// 处理所有其他未被捕获的异常
@ExceptionHandler(Exception.class)
@ResponseBody
public ResponseEntity<ErrorResponse> handleGeneralException(Exception ex) {
ErrorResponse errorResponse = new ErrorResponse("An unexpected error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR.value());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
Last updated on